Need to save and restore MSRs for VMX domains across context switches.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 13 Jul 2005 08:36:38 +0000 (08:36 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 13 Jul 2005 08:36:38 +0000 (08:36 +0000)
Signed-off-by: Yunhong Jiang <yunhong.jiang@intel.com>
Signed-off-by: Jun Nakajima <jun.nakajima@intel.com>
Signed-off-by: Arun Sharma <arun.sharma@intel.com>
xen/arch/x86/domain.c

index acf7d89343985bbe00e6e258b63e6b97403e47d1..609822d40ae0e653ecadbe12a740bb62c63f4ba1 100644 (file)
@@ -643,6 +643,10 @@ static void load_segments(struct vcpu *p, struct vcpu *n)
 static void save_segments(struct vcpu *v)
 {
     struct cpu_user_regs *regs = &v->arch.guest_context.user_regs;
+
+    if ( VMX_DOMAIN(v) )
+        rdmsrl(MSR_SHADOW_GS_BASE, v->arch.arch_vmx.msr_content.shadow_gs);
+
     __asm__ __volatile__ ( "movl %%ds,%0" : "=m" (regs->ds) );
     __asm__ __volatile__ ( "movl %%es,%0" : "=m" (regs->es) );
     __asm__ __volatile__ ( "movl %%fs,%0" : "=m" (regs->fs) );
@@ -791,7 +795,11 @@ void context_switch(struct vcpu *prev, struct vcpu *next)
 
         local_irq_enable();
         
-        if ( !VMX_DOMAIN(next) )
+        if ( VMX_DOMAIN(next) )
+        {
+            vmx_restore_msrs(next);
+        }
+        else
         {
             load_LDT(next);
             load_segments(realprev, next);